package com.ntty.server;

import com.ntty.factory.PipelineFactory;
import com.ntty.client.MyWebSocketHandler;
import com.ntty.factory.HttpPipelineFactory;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
import io.netty.handler.timeout.IdleStateHandler;

/**
 * 在应用程序中添加WebSocket支持很容易，Netty附带了WebSocket的支持，
 * 
 * 通过ChannelHandler来实现。使用WebSocket有不同的消息类型需要处理。
 * 
 * 下面列表列出了Netty中WebSocket类型：
 * 
 * BinaryWebSocketFrame，包含二进制数据
 * 
 * TextWebSocketFrame，包含文本数据
 * 
 * ContinuationWebSocketFrame，包含二进制数据或文本数据，BinaryWebSocketFrame和TextWebSocketFrame的结合体
 *
 * CloseWebSocketFrame，WebSocketFrame代表一个关闭请求，包含关闭状态码和短语
 * 
 * PingWebSocketFrame，WebSocketFrame要求PongWebSocketFrame发送数据
 * 
 * PongWebSocketFrame，WebSocketFrame要求PingWebSocketFrame响应
 * 
 * 为了简化，我们只看看如何使用WebSocket服务器。客户端使用可以看Netty自带的WebSocket例子。
 * 
 * Netty提供了许多方法来使用WebSocket，但最简单常用的方法是使用WebSocketServerProtocolHandler。 看下面代码：
 * 
 * HttpServerCodec Http编码器。
 * 
 * HttpObjectAggregator Http消息聚合。
 * 
 * 
 * ChunkedWriteHandler 大数据处理，主要针对SSL加密解密。
 * 
 * 
 * HttpRequestHandler 用户自定义处理ws请求。
 * 
 * 
 * WebSocketServerProtocolHandler
 * 处理除TextWebSocketFrame以外的消息事件。所有规定的WebSocket帧类型。
 * 
 * 
 * TextWebSocketFrameHandler 用户自定义处理TextWebSocketFrame的消息事件。
 * 
 * @author Administrator
 *
 */
public class WebSocketInitializer extends ChannelInitializer<SocketChannel> {

	@Override
	protected void initChannel(SocketChannel ch) throws Exception {
		ChannelPipeline pipeline = ch.pipeline();
		// 设置30秒没有读到数据，则触发一个READER_IDLE事件。
		PipelineFactory.reg空闲处理器(pipeline, 30, 0, 0);
		HttpPipelineFactory.reg服务端Http编码(pipeline);
		HttpPipelineFactory.reg消息聚合(pipeline, 8192);
		HttpPipelineFactory.reg分块写入(pipeline);

		// 用于处理websocket, /ws为访问websocket时的uri
		pipeline.addLast("webSocketServerProtocolHandler", new WebSocketServerProtocolHandler("/ws"));
		pipeline.addLast("myWebSocketHandler", new MyWebSocketHandler());
	}
}